package mysql;

import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Connection;

public class MySQLConnect {

    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    //	thông tin cần thiết để kết nối.
    String host = "";
    String username = "";
    String password = "";
    String database = "";

    Connection connect = null;
    Statement statement = null;
    ResultSet result = null;

    // mặc định
    public MySQLConnect() {
        this.host = "localhost";
        this.username = "root";
        this.password = "";
        this.database = "muachung";
    }

    public MySQLConnect(String Host, String Username, String Password, String Database) {
        this.host = Host;
        this.username = Username;
        this.password = Password;
        this.database = Database;
    }

    // hàm kiểm tra driver có sẵn sàng chưa
    protected void driverTest() throws Exception {
        try {
            //kiem tra class name
            Class.forName(JDBC_DRIVER);
        } catch (java.lang.ClassNotFoundException e) {
            throw new Exception("MySQL JDBC driver không được tìm thấy");
        }
    }

    // hàm lấy connection
    protected Connection getConnect() throws Exception {
        // nếu connection == null thi khoi tao
        if (this.connect == null) {
            //kiem tra driver
            driverTest();

            //tao connectString ket noi database sever
            String connectString = "jdbc:mysql://" + this.host + ":3306/" + this.database + "?useUnicode=true&characterEncoding=UTF-8";
            try {
                // tao ket noi
                this.connect = (Connection) DriverManager.getConnection(connectString, this.username, this.password);

            } // vang loi neu ko ket noi duoc
            catch (java.sql.SQLException e) {
                throw new Exception("Không thể kết nối tới database");
            }

            return this.connect;
        }
        return this.connect;
    }

    // hàm lấy statement
    protected Statement getStatement() throws Exception {
        // kiem tra statement 
        if (this.statement == null) {
            this.statement = this.getConnect().createStatement();
        }
        return this.statement;
    }

	// hàm thực thi sql select
    public ResultSet excuteQuery(String Query) throws Exception {
        try {
            this.result = getStatement().executeQuery(Query);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return this.result;
    }

	// hàm thuc thi insert, update, delete
    public int excuteUpdate(String Query) throws Exception {
        // khai báo biến int lưu trữ kết quả thực thi
        int res = Integer.MIN_VALUE;
        try {
            // thực thi câu lệnh
            res = getStatement().executeUpdate(Query);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            this.Close();
        }
        return res;
    }

    // hàm đếm số dòng dữ liệu
    public static int coutRow(ResultSet rs) {
        int rowcount = 0;
        try {
            if (rs.last()) {
                rowcount = rs.getRow();
                rs.beforeFirst();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return rowcount;
    }

    // hàm đóng kết nối
    public void Close() throws SQLException {
        // nếu result chưa đóng thì đóng 
        if (this.result != null) {
            this.result.close();
            this.result = null;
        }

        // nếu statement chưa đóng thì đóng
        if (this.statement != null) {
            this.statement.close();
            this.statement = null;
        }

        // nếu connection chưa đóng thì đóng
        if (this.connect != null) {
            this.connect.close();
            this.connect = null;
        }
    }

}
